/*
 * 1、获取对象的原型: 
 *    (1)、可以通过对象的prototype属性来获取 
 *    (2)、可以通过实例的__proto__属性来获取
 *    (3)、可以通过Object.getPrototypeOf( instance ) 来获取
 * 2、获取对象(构造函数)
 *    (1)、通过实例的constructor来获取
 *    (2)、通过原型的constructor来获取
 * 3、创建实例
 *    (1)、使用构造函数: new 构造函数(参数)
 *    (2)、使用字面量来创建Object对象的实例: { property: value , ... }
 *    (3)、Object.create( proto )
 */

// 定义对象(相当于Java语言中的类)
function Bull(name,age) {
    // 定义属性存储实例数据(描述某个个体特征的数据)
    this.name = name ;
    this.age = age ;
}

// 通过prototype属性来获得对象的原型
const proto = Bull.prototype ;
// 可以通过原型来定义函数
proto.introduce = function(){
    console.log( `大家好，我是${this.name}` );
}

let x = new Bull( '牛魔王' , 32 );
console.log( x );
x.introduce();

console.log( '- - - - - - - - - - - - - - - -' );

let y = new Bull( '红孩儿' , 10 );
console.log( y );
y.introduce();

console.log( '- - - - - - - - - - - - - - - -' );

console.log( '根据原型获得对应的对象' );
const cons = proto.constructor ; // 通过原型的constructor可以获得与其相应的构造函数
console.log( cons );
console.log( cons === Bull ); // true

console.log( '根据实例获得对应的对象' );
const c = x.constructor ; // 通过实例的constructor属性来获得与其对应的对象
console.log( c );
console.log( c === cons ); // true
console.log( c === Bull ); // true

console.log( '根据实例获得相应对象的原型' );
const p = x.__proto__ ;// 注意前后都是两个下划线
console.log( p === proto ); // true
const t = Object.getPrototypeOf( y );
console.log( t === proto ); // true

// 以 proto 为原型创建一个新的实例
let z = Object.create( proto );
console.log( z );